STL源码分析:浅析string和vector的区别 |
您所在的位置:网站首页 › string 和 char › STL源码分析:浅析string和vector的区别 |
目录 前言 转换为C-style字符串 重载输入输出流操作符 重载+、+=操作符 前言为什么会关注string和vector的区别? 先来说下string这个“类”。 string和vector、list、deque等容器不一样,在STL中并不存在class string{...},它实际上是一个全局类型,通过typedef定义: 也就是说,string实际上是通过basic_string类来实现的,而string则是模板类basic_string的char特例化版本,同样还有针对宽字节的wstring。 然后看看basic_string类: template class basic_string : private _String_base { ... size_type size() const { return _M_finish - _M_start; } size_type capacity() const { return (_M_end_of_storage - _M_start) - 1; } ... } /* string_base 类*/ template class _String_base { ... protected: typedef simple_alloc _Alloc_type; /*三个主要的成员*/ _Tp* _M_start; _Tp* _M_finish; _Tp* _M_end_of_storage; // Precondition: 0 < __n 0) { int __c1 = __buf->sbumpc(); //获取流中的字符 if (__c1 == EOF) { __is.clear(__is.rdstate() | ios::eofbit); break; } else { _CharT __c = _Traits::to_char_type(__c1); if (isspace((unsigned char) __c)) { ... } else __s.push_back(__c); //放入string中 } } ... } __is.width(0); } else ... return __is; }需要注意的是,对于重载输出流操作符,string是输出size()个元素,也就是说,不管string中存放的字符元素是什么,它都会将其输出,如果在string中存放的元素是{‘x’、'y'、'\0'、'z'},由于string的size是4,因此cout出来的结果就是"xy z",它并不会因为其中有一个终止符'\0'而不输出。这一点和C风格的char *字符串是不同的。 重载+、+=操作符vector并不能直接实现字符串的拼接,但是string可以,string中重载了+、+=运算符,以拼接两个字符串为例: template inline basic_string operator+(const basic_string& __x, const basic_string& __y) //重载+ { typedef basic_string _Str; typedef typename _Str::_Reserve_t _Reserve_t; _Reserve_t __reserve; _Str __result(__reserve, __x.size() + __y.size(), __x.get_allocator()); //开辟一个新的string __result.append(__x); //向新的string中添加传入的两个参数 __result.append(__y); return __result; } basic_string& operator+=(const basic_string& __s) { return append(__s); } //重载+=对比+和+=,可以看到,+=只是在原来基础上append新的字符串,而+则是需要将参数的两个字符串全部拷贝到新的字符串中,因此,和p+=q相比,p = p + q会更加的耗时。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |